home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 17
/
CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso
/
CUCD
/
Programming
/
DiceSource
/
lib
/
amiga
/
divu.a
< prev
next >
Wrap
Text File
|
1994-02-01
|
2KB
|
104 lines
; D0/D1
;
; (c)Copyright 1990, Matthew Dillon, All Rights Reserved
section text,code
xdef __divu
xdef _hyper__divu
_hyper__divu:
__divu:
tst.l D1
beq du5
swap D1
tst.w D1
bne du100 ; 32/32 -> 16
move.l D2,-(sp)
swap D1
move.l D0,D2
divu D1,D2 ; 32/16 -> 16r:16q
bvs du10
move.l D2,D1
clr.w D1
swap D1 ; D1 = remainder
moveq.l #0,D0
move.w D2,D0 ; D0 = quotient
move.l (sp)+,D2
rts
du5 move.l D0,D1 ; remainder = numerator
moveq.l #-1,D0 ; quotient = illegal
rts
; D0:32/D1:16 = :32, remainder = SWAP D2
du10 move.l D3,-(sp)
;;clr.w D2 ; D2 = r.0
;;swap D2 ; D2 = remainder.l
;;move.l D2,-(sp)
;;sub.l D2,D0 ; D0 = D0 - remainder (new numerator)
move.l D0,D2
clr.w D2
swap D2 ; D2 = 0.msb of new numerator
divu D1,D2 ; D2 = r.qmsb
move.w D2,D3
swap D3
clr.w D3 ; D3 = qmsb.0
move.w D0,D2 ; D2 = r.nlsb
divu D1,D2 ; D2 = r.qlsb
move.w D2,D3
move.l D3,D0 ; D0 = quotient
clr.w D2
swap D2
move.l D2,D1 ; D1 = remainder
move.l (sp)+,D3
move.l (sp)+,D2
rts
; 32/32 -> 32 , D1 in lsb.msb order (D0.32 / D1.32)
du100 movem.l D2-D4,-(sp)
move.l D0,D2
clr.w D2
swap D2 ; D2 = numerator 0.msb
divu D1,D2 ; 0.msb / x.msb, D2.w = result
move.w D2,D3
moveq.l #0,D2
move.w D3,D2 ; D2.l = result (0.result)
mulu.w D1,D3 ; D3.l = D1.w.msb x result (0.msb x)
swap D1 ; D1 now in msb.lsb order
move.w D2,D4
mulu.w D1,D4 ; D4.l = D1.w.lsb x result (0.lsb x)
swap D3 ; D3 = msb.0 x
add.l D4,D3 ; D3 = multiplication result
sub.l D3,D0 ; D0 = D0 - D3.
bmi du150
move.l D0,D1 ; D1 = remainder
move.l D2,D0 ; D0 = quotient
movem.l (sp)+,D2-D4
rts
du150 subq.l #1,D2 ; D0 is negative, add D1 until it becomes +
add.l D1,D0
bmi du150
move.l D0,D1 ; D1 = remainder
move.l D2,D0 ; D0 = quotient
movem.l (sp)+,D2-D4
rts
END